/*
 * Diplomova prace: Vyuziti embedded modulu pro monitoring zivotnich funkci
 *                  pacienta
 * Trida: Spojeni.java
 * Autor: Tomas Cinert
 * Vytvorena 3.4. 2012
 */
package tcinert;
import com.siemens.icm.io.CommConnectionControlLines;
import java.io.DataInputStream;
import java.io.IOException;
import tcinert.Stav;
/**
 *Trida Spojeni -cteni dat a overeni spravnosti dat
 *@author Tomas Cinert
 *@version 0.9.1
 */
public class Spojeni implements Runnable{
    /* Knihovny */
    Zaznam log;
    Stav stavDat;
    /* Pomocne promenne*/
    StringBuffer sb;
    int c;
    CommConnectionControlLines spojeni;
    DataInputStream vstup;
    boolean loop=true;
    
    /**
     * Konstruktor vytvori spojeni
     * 
     */
    public  Spojeni(Zaznam z, StringBuffer buffer, CommConnectionControlLines spojeni,Stav stav){
        this.log=z;
        this.sb=buffer;
        this.spojeni=spojeni;
        this.stavDat=stav;
        
        try {
            vstup = spojeni.openDataInputStream();          // Otevreni vstupStreamu
            log.zapis("Seriove spojeni otevreno",typZapisu.Informativni);// Inicializace bufferu
        } catch (IOException ex) {                  // V pripade problemu (nedoslo k otevreni, preteceni timeoutu)
            log.zapis("Nepodaril se vytvorit datovy stream",typZapisu.Chybovy);
        }
    }
    /**
     *Metoda na smazani predchoziho bufferu
     **/
    private void smazaniBufferu() {
        if(sb.length()!=0){
            sb.delete(0,17);
        }
    }
    
    /**
     *Metoda na test dostupnosti dat
     * 
     * @throws IOEception pri nedostupnych datech
     **/
    private boolean dostupnaData() throws IOException {
        if(vstup.available()>0) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     *Metoda na cteni dat a jejich verifikaci (zda se jedna o spravny ramce)
     * 
     * @throws IOException pri problemech se cteni dat ze vstupniho bufferu
     **/
    public synchronized String cteniDat() throws IOException {
        smazaniBufferu();
        if(dostupnaData()){
            c = vstup.read();       // Nacteni  vstupu
            if(c=='<') {
                log.zapis("Mame start ramce",typZapisu.Informativni);
                for(int i=0;i<18;i++){
                    if(dostupnaData()) {
                        c=vstup.read();
                        sb.append((char)c);            // Ulozeni do bufferu
                        
                    } else {
                        
                        log.zapis("Nedosly veskara data",typZapisu.Chybovy);
                        return null;
                    }
                }
                
                loop=false;
                if(sb.charAt(17)!='>')      // Prijaty neuplna data 
                {
                    log.zapis("Prijaty neuplna data",typZapisu.Chybovy);
                    sb.delete(0,17);//Smazani bufferu
                    return null;
                } else {
                    sb.deleteCharAt(17);
                    stavDat.setData(true);
                    log.zapis("Prijate data v poradku.",typZapisu.Informativni); 
                    log.zapis("Data:"+sb.toString(),typZapisu.Informativni);
                    loop=false;
                    return sb.toString();
                }
                
            }
            
        }else{
            log.zapis("Data nejsou dostupna",typZapisu.Chybovy);
            loop=false;
            return null;
        }
        
        return sb.toString();
    }
    /**
     *Metoda volana pri startu vlakna
     **/
    public void run() {
        log.zapis("Zaciname cist data",typZapisu.Informativni);
        while(loop) {
            try {
                cteniDat();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
        }
        try {
            vstup.close();
            Thread.sleep(1000);
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch(InterruptedException ex){
            ex.printStackTrace();}
        log=null;
        
    }
    
}



